/*
 * Copyright (c) "Neo4j"
 * Neo4j Sweden AB [https://neo4j.com]
 *
 * This file is part of Neo4j.
 *
 * Neo4j is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
package org.neo4j.consistency.statistics;

/**
 * Increments counts of different types, per thread. Able to sum a count for all threads as well.
 */
public interface Counts {
    enum Type {
        skipCheck,
        missCheck,
        checked,
        checkErrors,
        legacySkip,
        correctSkipCheck,
        skipBackup,
        overwrite,
        noCacheSkip,
        activeCache,
        clearCache,
        noCache,
        relSourcePrevCheck,
        relSourceNextCheck,
        relTargetPrevCheck,
        relTargetNextCheck,
        relCacheCheck,
        forwardLinks,
        backLinks,
        nullLinks,
        nodeSparse,
        nodeDense
    }

    void incAndGet(Type type, int threadIndex);

    long sum(Type type);

    void reset();

    Counts NONE = new Counts() {
        @Override
        public void reset() {}

        @Override
        public void incAndGet(Type type, int threadIndex) {}

        @Override
        public long sum(Type type) {
            return 0;
        }
    };
}
